#include <iostream>
#include <unistd.h>
#include <thread>

void thread_run()
{
    while (true)
    {
        std::cout << "我是新线程..." << std::endl;
        sleep(1);
    }
}

int main()
{
    std::thread t1(thread_run);

    while (true)

    {
        std::cout << "我是主线程..." << std::endl;
        sleep(1);
    }
    t1.join();

    return 0;
}

















// #include <iostream>
// #include <vector>
// #include <string>
// #include <cstdio>
// #include <cassert>
// #include <pthread.h>
// #include <unistd.h>

// using namespace std;

// 当成结构体使用

// class ThreadData
// {
// public:
//     int number;
//     pthread_t tid;
//     char namebuffer[64];
// };

// class ThreadReturn
// {
// public:
//     int exit_code;
//     int exit_result;
// };

// void *start_routine(void *args)
// {
//     // sleep(1);
//     ThreadData *td = static_cast<ThreadData *>(args); // 安全的进行强制类型转换
//     int cnt = 10;
//     while (cnt)
//     {
//         cout << "cnt: " << cnt << " &cnt：" << &cnt << endl;
//         cnt--;
//         // cout << "new thread create success, name: " << td->namebuffer << " cnt: " << cnt-- << endl;
//         sleep(1);
//     }
//     // return nullptr;
//     //  delete td;
//     // pthread_exit(nullptr);
//     // return (void *)td->number; // void* ret = (void*)td->number;
//     // 这里把int类型的8字节数据转换为4字节的指针会警告，但是我们不用管。
//     // 既然假的地址，整数的地址都能被外部拿到，那么返回的是，堆空间的地址呢？对象的地址呢？
//     ThreadReturn *tr = new ThreadReturn();
//     // 假设
//     tr->exit_code = 1;
//     tr->exit_result = 222;
//     return (void *)tr;

//     //  注意：下面这种写法是错误的。
//     //  ThreadReturn tr;
//     //  tr->exit_code=1;
//     //  tr->exit_result=222;
//     //    return (void*)tr;
//     //  tr是在栈上开辟的空间，出了栈就被销毁了。
// }

// int main()
// {
//     vector<ThreadData *> threads;
// #define NUM 10
//     for (int i = 0; i < NUM; i++)
//     {
//         ThreadData *td = new ThreadData();
//         td->number = i + 1;
//         snprintf(td->namebuffer, sizeof(td->namebuffer), "%s:%d", "thread", i + 1);
//         pthread_create(&td->tid, nullptr, start_routine, td);
//         threads.push_back(td);
//     }
//     for (auto &iter : threads)
//     {
//         cout << "create thread: " << iter->namebuffer << " : " << iter->tid << " success" << endl;
//     }
//     // 线程等待
//     for (auto &iter : threads)
//     {
//         ThreadReturn *ret = nullptr;
//         // void *ret = nullptr;                         // 注意：是void*
//         int n = pthread_join(iter->tid, (void **)&ret); // 函数内部会做 eg：void** retp = &ret;  *retp = return (void*) td->number;
//         assert(0 == n);
//         // cout << "join : " << iter->namebuffer << "  success, number: " << (long long)ret << endl;
//         cout << "join : " << iter->namebuffer << "  success, exit_code: " << ret->exit_code << ",exit_result: " << ret->exit_result << endl;
//         delete iter;
//     }

//     cout << "main thread quit " << endl;

//     // while (true)
//     // {
//     //     cout << "new thread create success, name: main thread" << endl;
//     //     sleep(1);
//     // }
//     return 0;
// }

// class ThreadData
// {
// public:
//     int number;
//     pthread_t tid;
//     char namebuffer[64];
// };

// class ThreadReturn
// {
// public:
//     int exit_code;
//     int exit_result;
// };

// void *start_routine(void *args)
// {
//     // sleep(1);
//     ThreadData *td = static_cast<ThreadData *>(args); // 安全的进行强制类型转换
//     int cnt = 10;
//     while (cnt)
//     {
//         cout << "cnt: " << cnt << " &cnt：" << &cnt << endl;
//         cnt--;
//         // cout << "new thread create success, name: " << td->namebuffer << " cnt: " << cnt-- << endl;
//         sleep(1);
//     }
//     // return nullptr;
//     //  delete td;
//     // pthread_exit(nullptr);
//     return (void *)111; // void* ret = (void*)td->number;
//     // 这里把int类型的8字节数据转换为4字节的指针会警告，但是我们不用管。
//     // 既然假的地址，整数的地址都能被外部拿到，那么返回的是，堆空间的地址呢？对象的地址呢？
//     // ThreadReturn *tr = new ThreadReturn();
//     // 假设
//     // tr->exit_code = 1;
//     // tr->exit_result = 222;
//     // return (void *)tr;

//     //  注意：下面这种写法是错误的。
//     //  ThreadReturn tr;
//     //  tr->exit_code=1;
//     //  tr->exit_result=222;
//     //    return (void*)tr;
//     //  tr是在栈上开辟的空间，出了栈就被销毁了。
// }

// int main()
// {
//     vector<ThreadData *> threads;
// #define NUM 10
//     for (int i = 0; i < NUM; i++)
//     {
//         ThreadData *td = new ThreadData();
//         td->number = i + 1;
//         snprintf(td->namebuffer, sizeof(td->namebuffer), "%s:%d", "thread", i + 1);
//         pthread_create(&td->tid, nullptr, start_routine, td);
//         threads.push_back(td);
//     }
//     for (auto &iter : threads)
//     {
//         cout << "create thread: " << iter->namebuffer << " : " << iter->tid << " success" << endl;
//     }
//     // 线程取消
//     sleep(5);
//     for (int i = 0; i < threads.size() / 2; i++)
//     {
//         pthread_cancel(threads[i]->tid);
//         cout << "pthread_cancel : " << threads[i]->namebuffer << " success" << endl;
//     }
//     // 线程等待
//     for (auto &iter : threads)
//     {
//         void *ret = nullptr;
//         int n = pthread_join(iter->tid, &ret);
//         assert(0 == n);
//         cout << "join : " << iter->namebuffer << "  success, exit_code: " << (long long)ret << endl;
//         delete iter;
//     }

//     cout << "main thread quit " << endl;

//     // while (true)
//     // {
//     //     cout << "new thread create success, name: main thread" << endl;
//     //     sleep(1);
//     // }
//     return 0;
// }

// using namespace std;

// void *start_routine(void *args)
// {
//     string name = static_cast<const char *>(args); // 安全的进行强制类型转换
//     while (true)
//     {
//         cout << "new thread create success, name: " << name << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     vector<pthread_t> tids;
// #define NUM 10
//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_t tid;
//         char namebuffer[64];
//         snprintf(namebuffer, sizeof(namebuffer), "%s:%d", "thread", i);
//         pthread_create(&tid, nullptr, start_routine, namebuffer);
//        // sleep(1);
//     }
//     while (true)
//     {
//         cout << "new thread create success, name: main thread" << endl;
//         sleep(1);
//     }
//     return 0;
// }

// int g_val = 0;

// string fun()
// {
//     return "我是一个独立的方法";
// }

// // 新线程
// void *thread_routine(void *args)
// {
//     const char *name = (const char *)args;
//     while (true)
//     {
//         fun();
//         cout << "我是新线程, 我正在运行! name: " << name << " : "<< fun()  << " : " << g_val++ << " &g_val : " << &g_val << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     // typedef unsigned long int pthread_t;
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, thread_routine, (void *)"thread one");
//     assert(0 == n);
//     (void)n;

//     // 主线程
//     while (true)
//     {
//         // 地址 -> ?
//         char tidbuffer[64];
//         snprintf(tidbuffer, sizeof(tidbuffer), "0x%x", tid);
//         cout << "我是主线程, 我正在运行!, 我创建出来的线程的tid： " << tidbuffer << " : " << g_val << " &g_val : " << &g_val << endl;
//         sleep(1);
//     }

//     return 0;
// }